/**
 * 除法
 * @param a string|number 被除数
 * @param b string|number 除数  不能0
 * @param fix int >=0 最多保留小数位数
 * @param op int 多出位数处理方式
 * 		0:四舍五入, 1:向上取整, -1:向下取整
 * @param pad boolean 小数不足fix位是否补0
 * @return string  参数b=0时=>''
 */
$.bcDiv = function(a, b, fix=2, op=0, pad=false){
	const T0=v=>v.replace(/^0+/,''), R0=n=>'0'.repeat(n);
	const COM = (a,b)=>{ // 比较: a>b
		const A=a.length, B=b.length;
		return A>B || (A===B && a>b);
	};
	const POW = (a,b)=>{ // 计算n: a>b+10^n
		const s=a.length-b.length; if(s<=0) return 0;
		if(a[0]<b[0]) return s-1; let eq=a[0]===b[0];
		return eq && b+R0(s)>a ? s-1 : s;
	};
	const DIV = function(a, b, n, x){
		a=T0(a);  b=T0(b);  let v='0', s;  n++;
		if(x+=n) x>0 ? (a+=R0(x)) : (b+=R0(-x));
		while((s=POW(a,b))>0){ // 优先计算:>10^n倍
			v=$.bcAddInt(v,1+(s=R0(s)));  a=$.bcSubInt(a,b+s);
		}
		while(COM(a,b)){ v=$.bcAddOne(v); a=$.bcSubInt(a,b); }
		const N=v.length; if(N<n+1) v=R0(n+1-N)+v; //至少1整数
		if(a!=='0' && v[N-1]==='0') v=v.slice(0,-1)+'1';//余数
		const dot = v.slice(-n).replace(/0+$/,'');
		return v.slice(0,-n)+(dot?'.'+dot:'');
	}
	$.bcDiv = function(a, b, fix=2, op=0, pad=false){
		const [a_,ai,A]=$.bcArr(a), [b_,bi,B]=$.bcArr(b);
		b=bi+B;  if(!b) return ''; const _=a_!==b_; let v;
		a=ai+A;  if(!a) return fix&&pad?'0.'+R0(fix):'0';
		v=b==='1'?ai+'.'+A:DIV(a,b,fix,B.length-A.length);
		return $.bcFix((_?'-':'')+v, fix, op, pad);
	};
	return $.bcDiv(a, b, fix, op, pad);
};
